This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Cmd+Shift+Enter.

library(plotly)

Attaching package: ‘plotly’

The following object is masked from ‘package:ggplot2’:

    last_plot

The following object is masked from ‘package:stats’:

    filter

The following object is masked from ‘package:graphics’:

    layout

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Cmd+Option+I.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Cmd+Shift+K to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.

names(df)
 [1] "Release"               "Release.date"          "Release.type"          "Band"                 
 [5] "Genre"                 "Location"              "Lyrical.themes"        "Number.of.reviews"    
 [9] "Average.rating"        "genre_early"           "genre_later"           "genre_early_secondary"
[13] "genre_later_secondary" "location_early"        "genre_early_main"      "genre_later_main"     
[17] "genre_early_stripped"  "genre_later_stripped" 
levels(df_year$genre_early_main)
 [1] "Heavy Metal"       "Doom Metal"        "Thrash Metal"      "Power Metal"      
 [5] "Nu Metal"          "Progressive Metal" "Black Metal"       "Metalcore"        
 [9] "Death Metal"       "Folk Metal"        "Ambient"          
names(df)
 [1] "Release"               "Release.date"          "Release.type"          "Band"                  "Genre"                
 [6] "Location"              "Lyrical.themes"        "Number.of.reviews"     "Average.rating"        "genre_early"          
[11] "genre_later"           "genre_early_secondary" "genre_later_secondary" "location_early"        "genre_early_main"     
[16] "genre_later_main"      "genre_early_stripped"  "genre_later_stripped"  "release_year"         
df %>% plot_ly(x = ~Number.of.reviews, y = ~Average.rating, name = "Band")
No trace type specified:
  Based on info supplied, a 'scatter' trace seems appropriate.
  Read more about this trace type -> https://plot.ly/r/reference/#scatter
No scatter mode specifed:
  Setting the mode to markers
  Read more about this attribute -> https://plot.ly/r/reference/#scatter-mode
No trace type specified:
  Based on info supplied, a 'scatter' trace seems appropriate.
  Read more about this trace type -> https://plot.ly/r/reference/#scatter
No scatter mode specifed:
  Setting the mode to markers
  Read more about this attribute -> https://plot.ly/r/reference/#scatter-mode

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2suIFdoZW4geW91IGV4ZWN1dGUgY29kZSB3aXRoaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4gCgpUcnkgZXhlY3V0aW5nIHRoaXMgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpSdW4qIGJ1dHRvbiB3aXRoaW4gdGhlIGNodW5rIG9yIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW5zaWRlIGl0IGFuZCBwcmVzc2luZyAqQ21kK1NoaWZ0K0VudGVyKi4gCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShwbG90bHkpCmBgYAoKYGBge3J9CmRmIDwtIHJlYWQuY3N2KCdhbGJ1bXNfY2xlYW5lZC5jc3YnLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCmhlYWQoZGYpCmBgYAoKQWRkIGEgbmV3IGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqSW5zZXJ0IENodW5rKiBidXR0b24gb24gdGhlIHRvb2xiYXIgb3IgYnkgcHJlc3NpbmcgKkNtZCtPcHRpb24rSSouCgpXaGVuIHlvdSBzYXZlIHRoZSBub3RlYm9vaywgYW4gSFRNTCBmaWxlIGNvbnRhaW5pbmcgdGhlIGNvZGUgYW5kIG91dHB1dCB3aWxsIGJlIHNhdmVkIGFsb25nc2lkZSBpdCAoY2xpY2sgdGhlICpQcmV2aWV3KiBidXR0b24gb3IgcHJlc3MgKkNtZCtTaGlmdCtLKiB0byBwcmV2aWV3IHRoZSBIVE1MIGZpbGUpLiAKClRoZSBwcmV2aWV3IHNob3dzIHlvdSBhIHJlbmRlcmVkIEhUTUwgY29weSBvZiB0aGUgY29udGVudHMgb2YgdGhlIGVkaXRvci4gQ29uc2VxdWVudGx5LCB1bmxpa2UgKktuaXQqLCAqUHJldmlldyogZG9lcyBub3QgcnVuIGFueSBSIGNvZGUgY2h1bmtzLiBJbnN0ZWFkLCB0aGUgb3V0cHV0IG9mIHRoZSBjaHVuayB3aGVuIGl0IHdhcyBsYXN0IHJ1biBpbiB0aGUgZWRpdG9yIGlzIGRpc3BsYXllZC4KCmBgYHtyfQpuYW1lcyhkZikKYGBgCmBgYHtyfQpsaWJyYXJ5KGx1YnJpZGF0ZSkKZGYgPC0gZGYgJT4lIGZpbHRlcighKGdlbnJlX2Vhcmx5X21haW4gJWluJSBjKCdSb2NrJywgJ090aGVyJykpKSAlPiUgCiAgbXV0YXRlKHJlbGVhc2VfeWVhciA9IGFzLm51bWVyaWMoc3RyX3N1YihSZWxlYXNlLmRhdGUsMSw0KSkpCgpkZl95ZWFyIDwtIGRmICU+JSAKICBmaWx0ZXIoIShnZW5yZV9lYXJseV9tYWluICVpbiUgYygnUm9jaycsICdPdGhlcicpKSkgJT4lCiAgbXV0YXRlKHJlbGVhc2VfeWVhciA9IHN0cl9zdWIoUmVsZWFzZS5kYXRlLDEsNCksIAogICAgICAgICByZWxlYXNlX3llYXJfbW9udGggPSBzdHJfc3ViKFJlbGVhc2UuZGF0ZSwxLDcpKSAlPiUgCiAgICBtdXRhdGUocmVsZWFzZV95ZWFyID0gYXMubnVtZXJpYyhyZWxlYXNlX3llYXIpKSAlPiUgCiAgZmlsdGVyKCFpcy5uYShnZW5yZV9lYXJseV9tYWluKSwgZ2VucmVfZWFybHlfbWFpbiAhPSAnJywgcmVsZWFzZV95ZWFyID49IDE5NzAsIHJlbGVhc2VfeWVhciA8IDIwMTkpICU+JQogIGdyb3VwX2J5KHJlbGVhc2VfeWVhcikgJT4lIAogIGNvdW50KGdlbnJlX2Vhcmx5X21haW4pICU+JQogIG11dGF0ZShwZXJjZW50ID0gbi9zdW0obikpICU+JSAKICB1bmdyb3VwKCkgJT4lIAogIG11dGF0ZShnZW5yZV9lYXJseV9tYWluID0gZmN0X3Jlb3JkZXIoZ2VucmVfZWFybHlfbWFpbiwgcmVsZWFzZV95ZWFyKSkKICAjc3VtbWFyaXplKGEgPSBjb3VudChnZW5yZV9lYXJseV9tYWluKS90b3RhbCkjICU+JQogICNjb3VudChnZW5yZV9lYXJseV9tYWluKQoKCmRmX3llYXIgJT4lIGFycmFuZ2UocmVsZWFzZV95ZWFyKQpgYGAKYGBge3J9CmxldmVscyhkZl95ZWFyJGdlbnJlX2Vhcmx5X21haW4pCmBgYApgYGB7cn0KZGZfeWVhciAlPiUgaApgYGAKCgpgYGB7ciBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD04fQpnMSA8LSBnZ3Bsb3QoZGZfeWVhciwgYWVzKHg9cmVsZWFzZV95ZWFyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICB5PXBlcmNlbnQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICMgdGV4dCA9IHNwcmludGYoIkdlbnJlOiAlcwogICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgTnVtYmVyIG9mIFJlbGVhc2VzOiAlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgIFBlcmNlbnQ6ICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgIGdlbnJlX2Vhcmx5X21haW4sIG4sIHNjYWxlczo6cGVyY2VudChwZXJjZW50KSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1mY3RfcmV2KGdlbnJlX2Vhcmx5X21haW4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgKSkgKyAKICAgIGdlb21fYXJlYShwb3NpdGlvbiA9ICdzdGFjaycpICsgCiAgbGFicyh4PSJSZWxlYXNlIFllYXIiLCAKICAgICAgIHkgPSAiUGVyY2VudCBvZiBSZWxlYXNlcyIsIAogICAgICAgZmlsbCA9ICJNYWluIEdlbnJlIiwKICAgICAgIHRpdGxlID0gIlBlcmNlbnQgb2YgTWV0YWwgR2VucmUgUmVsZWFzZXMgQnkgWWVhciIpICsgCiAgI3hsaW0oYygxOTcwLCAyMDE4KSkgKyB5bGltKGMoMCwgMSkpICsgCiAgICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoMCwxKSwgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50LCBleHBhbmQgPSBjKDAsIDApKSArIAogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygxOTcwLCAyMDE4KSwgZXhwYW5kID0gYygwLCAwKSkgKyAKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJCbGFjayBNZXRhbCIgPSAiIzAwMDAwMCIsICNibGFjawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZWF0aCBNZXRhbCIgPSAiIzhmMDAwMCIsICNkYXJrIHJlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRocmFzaCBNZXRhbCIgPSAiIzdjZjAwMCIsICNsaWdodCBncmVlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRvb20gTWV0YWwiID0gIiM3ZTNmMGMiLCAjYnJvd24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbWJpZW50IiA9ICIjN2Q3ZDdkIiwgI2dyYXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb3dlciBNZXRhbCIgPSAiI2Y3MmJhZCIsICNwaW5rCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVhdnkgTWV0YWwiID0gIiMxZDAwZmEiLCAjYmx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1ldGFsY29yZSIgPSAiI2VlNjkxNyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTnUgTWV0YWwiID0gIiNmZmQ2MGEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByb2dyZXNzaXZlIE1ldGFsIiA9ICIjMGFkZWZmIiwgI2xpZ2h0IGJsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGb2xrIE1ldGFsIiA9ICIjYjEyMGQ5IiAjcHVycGxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICkgKyAKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLAogIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siKSkKZzEKZ2dwbG90bHkoZzEsIAogICAgICAgICB0b29sdGlwID0gInRleHQiLCAKICAgICAgICAgd2lkdGggPSA5MDAsIGhlaWdodCA9IDYwMCkKYGBgCmBgYHtyfQpuYW1lcyhkZikKYGBgCgpgYGB7ciBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD01fQpnMiA8LSBkZiAlPiUgZmlsdGVyKCEoZ2VucmVfZWFybHlfbWFpbiAlaW4lIGMoJ1JvY2snLCAnT3RoZXInKSkpICU+JQogIG11dGF0ZShyZWxlYXNlX3llYXIgPSBhcy5udW1lcmljKHN0cl9zdWIoUmVsZWFzZS5kYXRlLCAxLCA0KSksCiAgICAgICAgIEF2ZXJhZ2UucmF0aW5nID0gcm91bmQoQXZlcmFnZS5yYXRpbmcsIDEpKSAlPiUgCiAgZmlsdGVyKE51bWJlci5vZi5yZXZpZXdzID49IDUpICU+JQogIGdncGxvdCgpICsgCiAgZ2VvbV9wb2ludChhZXMoeCA9IE51bWJlci5vZi5yZXZpZXdzLCAKICAgICAgICAgICAgICAgICB5ID0gQXZlcmFnZS5yYXRpbmcsCiAgICAgICAgICAgICAgICAgY29sb3IgPSBnZW5yZV9lYXJseV9tYWluLAogICAgICAgICAgICAgICAgIHRleHQ9c3ByaW50ZigiQmFuZDogJXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxidW06ICVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbGVhc2UgRGF0ZTogJXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VucmU6ICVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhdGluZzogJXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIFJldmlld3M6ICVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhZ3M6ICVzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhbmQsIFJlbGVhc2UsIFJlbGVhc2UuZGF0ZSwgZ2VucmVfZWFybHlfbWFpbiwgQXZlcmFnZS5yYXRpbmcsIE51bWJlci5vZi5yZXZpZXdzLCBnZW5yZV9lYXJseV9zdHJpcHBlZCkpLCAKICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKHdpZHRoID0gMC41LCBoZWlnaHQgPSAwLjUpLAogICAgICAgICAgICAgc2l6ZSA9IDAuNCwKICAgICAgICAgICAgIGFscGhhID0gMC42CiAgICAgICAgICAgICApICsgCiAgbGFicyh4PSJOdW1iZXIgb2YgUmV2aWV3cyIsIAogICAgICAgeSA9ICJSYXRpbmciLCAKICAgICAgIGNvbG9yID0gIk1haW4gR2VucmUiLAogICAgICAgdGl0bGUgPSAiTWV0YWwgUmVsZWFzZXMgQnkgUmF0aW5nIGFuZCBOdW1iZXIgb2YgUmV2aWV3cyIpICsgCiAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiQmxhY2sgTWV0YWwiID0gIiMwMDAwMDAiLCAjYmxhY2sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGVhdGggTWV0YWwiID0gIiM4ZjAwMDAiLCAjZGFyayByZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaHJhc2ggTWV0YWwiID0gIiM3Y2YwMDAiLCAjbGlnaHQgZ3JlZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEb29tIE1ldGFsIiA9ICIjN2UzZjBjIiwgI2Jyb3duCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQW1iaWVudCIgPSAiIzdkN2Q3ZCIsICNncmF5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUG93ZXIgTWV0YWwiID0gIiNmNzJiYWQiLCAjcGluawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlYXZ5IE1ldGFsIiA9ICIjMWQwMGZhIiwgI2JsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNZXRhbGNvcmUiID0gIiNlZTY5MTciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk51IE1ldGFsIiA9ICIjZmZkNjBhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9ncmVzc2l2ZSBNZXRhbCIgPSAiIzBhZGVmZiIsICNsaWdodCBibHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRm9sayBNZXRhbCIgPSAiI2IxMjBkOSIgI3B1cnBsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICApICsgCiAgICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoMCwxMDApLCAgZXhwYW5kID0gYygwLCAwKSkgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoNSwgNDUpLCBleHBhbmQgPSBjKDAsIDApKSArIAogIHRoZW1lX2xpZ2h0KCkgKyAKICB0aGVtZSgjcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgI3BhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgI3BhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siKSkKICAjZ2VvbV9qaXR0ZXIoKQpnZ3Bsb3RseShnMiwgdG9vbHRpcD0idGV4dCIpCiMgZXhhbXBsZSBxdWVyeQojIGh0dHBzOi8vd3d3Lm1ldGFsLWFyY2hpdmVzLmNvbS9zZWFyY2g/c2VhcmNoU3RyaW5nPWlyb24rbWFpZGVuJnR5cGU9YmFuZF9uYW1lCmBgYApgYGB7cn0KZGYKYGBgCgpgYGB7ciBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD04fQpnMyA8LSBkZiAlPiUgZmlsdGVyKCEoZ2VucmVfZWFybHlfbWFpbiAlaW4lIGMoJ1JvY2snLCAnT3RoZXInKSksCiAgICAgICAgICAgICAgICAgICAgTnVtYmVyLm9mLnJldmlld3MgPj0gNSkgJT4lCiAgbXV0YXRlKEF2ZXJhZ2UucmF0aW5nID0gcm91bmQoQXZlcmFnZS5yYXRpbmcsIDEpLAogICAgICAgICByZWxlYXNlX3llYXJfbW9udGggPSBjYXNlX3doZW4oCiAgICAgICAgICAgc3RyX3N1YihSZWxlYXNlLmRhdGUsIDYsIDcpPT0nMDAnIH4gcGFzdGUwKHN0cl9zdWIoUmVsZWFzZS5kYXRlLCAxLCA1KSwgJzAxLTAxJyksCiAgICAgICAgICAgc3RyX3N1YihSZWxlYXNlLmRhdGUsIDksIDEwKT09JzAwJyB+IHBhc3RlMChzdHJfc3ViKFJlbGVhc2UuZGF0ZSwgMSwgOCksICcwMScpLAogICAgICAgICAgIFRSVUUgfiBSZWxlYXNlLmRhdGUpCiAgICAgICAgICNyZWxlYXNlX3llYXJfbW9udGggPSB5bWQocmVsZWFzZV95ZWFyX21vbnRoLCBvcmlnaW49bHVicmlkYXRlOjpvcmlnaW4pCiAgICAgICAgICkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcmVsZWFzZV95ZWFyX21vbnRoLCAKICAgICAgICAgICAgICAgICB5ID0gQXZlcmFnZS5yYXRpbmcsCiAgICAgICAgICAgICAgICAgY29sb3IgPSBnZW5yZV9lYXJseV9tYWluLAogICAgICAgICAgICAgZ3JvdXAgPSBCYW5kKQogICAgICAgICApICsgCiAgZ2VvbV9saW5lKGFscGhhPTAuMSkgKyAKICBnZW9tX3BvaW50KGFlcyhzaXplID0gTnVtYmVyLm9mLnJldmlld3MsCiAgICAgICAgICAgICAgICAgdGV4dD1zcHJpbnRmKCJCYW5kOiAlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGJ1bTogJXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVsZWFzZSBEYXRlOiAlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5yZTogJXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF0aW5nOiAlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIgb2YgUmV2aWV3czogJXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFnczogJXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFuZCwgUmVsZWFzZSwgUmVsZWFzZS5kYXRlLCBnZW5yZV9lYXJseV9tYWluLCBBdmVyYWdlLnJhdGluZywgTnVtYmVyLm9mLnJldmlld3MsIGdlbnJlX2Vhcmx5X3N0cmlwcGVkKSksCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aCA9IDAuMjUsIGhlaWdodCA9IDAuNSksCiAgICAgICAgICAgICBhbHBoYSA9IDAuNAogICAgICAgICAgICAgKSArIAogIGxhYnMoeD0gIlJlbGVhc2UgWWVhciIsIAogICAgICAgeSA9ICJSYXRpbmciLCAKICAgICAgIGNvbG9yID0gIk1haW4gR2VucmUiLAogICAgICAgc2l6ZSA9ICJOdW1iZXIgb2YgUmV2aWV3cyIsCiAgICAgICB0aXRsZSA9ICJNZXRhbCBSZWxlYXNlcyBCeSBSYXRpbmcgYW5kIFJlbGVhc2UgWWVhciIpICsgCiAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiQmxhY2sgTWV0YWwiID0gIiMwMDAwMDAiLCAjYmxhY2sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGVhdGggTWV0YWwiID0gIiM4ZjAwMDAiLCAjZGFyayByZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaHJhc2ggTWV0YWwiID0gIiM3Y2YwMDAiLCAjbGlnaHQgZ3JlZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEb29tIE1ldGFsIiA9ICIjN2UzZjBjIiwgI2Jyb3duCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQW1iaWVudCIgPSAiIzdkN2Q3ZCIsICNncmF5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUG93ZXIgTWV0YWwiID0gIiNmNzJiYWQiLCAjcGluawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlYXZ5IE1ldGFsIiA9ICIjMWQwMGZhIiwgI2JsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNZXRhbGNvcmUiID0gIiNlZTY5MTciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk51IE1ldGFsIiA9ICIjZmZkNjBhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9ncmVzc2l2ZSBNZXRhbCIgPSAiIzBhZGVmZiIsICNsaWdodCBibHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRm9sayBNZXRhbCIgPSAiI2IxMjBkOSIgI3B1cnBsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICApICsgCiAgICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoMCwxMDApLCAgZXhwYW5kID0gYygwLCAwKSkgKyAKICAjc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKDE5NzAsIDIwMTgpLCBleHBhbmQgPSBjKDAsIDApKSArIAogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZT1jKDEsOCkpICsgCiAgdGhlbWVfbGlnaHQoKSArIAogIHRoZW1lKCNwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICAjcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAjcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIpKQogICNnZW9tX2ppdHRlcigpCmczCmdncGxvdGx5KGczLCB0b29sdGlwPSJ0ZXh0IiwgaGVpZ2h0ID0gODAwLCB3aWR0aCA9IDEyMDApCgpkZiAlPiUgZmlsdGVyKCEoZ2VucmVfZWFybHlfbWFpbiAlaW4lIGMoJ1JvY2snLCAnT3RoZXInKSksCiAgICAgICAgICAgICAgICAgICAgTnVtYmVyLm9mLnJldmlld3MgPj0gNSkgJT4lCiAgbXV0YXRlKHJlbGVhc2VfeWVhciA9IGFzLm51bWVyaWMoc3RyX3N1YihSZWxlYXNlLmRhdGUsIDEsIDQpKSwKICAgICAgICAgUmVsZWFzZS5kYXRlID0gY2FzZV93aGVuKHN0cl9zdWIoUmVsZWFzZS5kYXRlLCA2LCA3KT09JzAwJyB+IGFzLmNoYXJhY3RlcihyZWxlYXNlX3llYXIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX3N1YihSZWxlYXNlLmRhdGUsIDksIDEwKT09JzAwJyB+IHN0cl9zdWIoUmVsZWFzZS5kYXRlLCAxLCA3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBSZWxlYXNlLmRhdGUpLAogICAgICAgICAjciA9IGx1YnJpZGF0ZTo6eW1kKFJlbGVhc2UuZGF0ZSksCiAgICAgICAgIHIgPSBsdWJyaWRhdGU6OnltZChSZWxlYXNlLmRhdGUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1bmNhdGVkPTIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICNvcmlnaW49bHVicmlkYXRlOjpvcmlnaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgIHJlbGVhc2VfeWVhcl9tb250aCA9IGNhc2Vfd2hlbighaXMubmEocikgfiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiByZWxlYXNlX3llYXIpCiAgICAgICAgICMgcmVsZWFzZV95ZWFyX21vbnRoID0geW1kKFJlbGVhc2UuZGF0ZSwgCiAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgIHRydW5jYXRlZD0yLAogICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW4gPSAnMTk2NS0wMS0wMScpCiAgICAgICAgICkgJT4lIHNlbGVjdChSZWxlYXNlLmRhdGUsIHJlbGVhc2VfeWVhcl9tb250aCwgcikKCmRmICU+JSBtdXRhdGUocmVsZWFzZV95ZWFyX21vbnRoID0geW1kKFJlbGVhc2UuZGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1bmNhdGVkPTIpKSAlPiUgYXJyYW5nZShyZWxlYXNlX3llYXJfbW9udGgpICU+JSBzZWxlY3QoUmVsZWFzZS5kYXRlLCByZWxlYXNlX3llYXJfbW9udGgpCmRmICU+JSAKICBtdXRhdGUociA9IGNhc2Vfd2hlbihzdHJfc3ViKFJlbGVhc2UuZGF0ZSwgNiwgNykgPT0gJzAwJyB+IGFzLkRhdGUoYXMuY2hhcmFjdGVyKHJlbGVhc2VfeWVhciksIGZvcm1hdD0nJVknKSwKICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gYXMuRGF0ZShSZWxlYXNlLmRhdGUsIGZvcm1hdD0nJVktJW0tJWQnKQogICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICApICU+JSBzZWxlY3QoUmVsZWFzZS5kYXRlLCByZWxlYXNlX3llYXIsIHIpCmRmICU+JSAKICBzZWxlY3QoUmVsZWFzZS5kYXRlKSAlPiUgCiAgbXV0YXRlKHIgPSBjYXNlX3doZW4oc3RyX3N1YihSZWxlYXNlLmRhdGUsIDYsIDcpPT0nMDAnIH4gcGFzdGUwKHN0cl9zdWIoUmVsZWFzZS5kYXRlLCAxLCA1KSwgJzAxLTAxJyksCiAgICAgICAgICAgICAgICAgICAgICAgc3RyX3N1YihSZWxlYXNlLmRhdGUsIDksIDEwKT09JzAwJyB+IHBhc3RlMChzdHJfc3ViKFJlbGVhc2UuZGF0ZSwgMSwgOCksICcwMScpLAogICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBSZWxlYXNlLmRhdGUKICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICByZWxlYXNlX2RheSA9IHltZChyKQogICAgICAgICApCmRmICU+JSBtdXRhdGUocj15bWQoUmVsZWFzZS5kYXRlKSkKZGYgJT4lIHNlbGVjdChSZWxlYXNlLmRhdGUpICU+JSBhcnJhbmdlKFJlbGVhc2UuZGF0ZSkKYGBgCgoKYGBge3J9CmRmCmRmICU+JSAKICBwbG90X2x5KHggPSB+TnVtYmVyLm9mLnJldmlld3MsIHkgPSB+QXZlcmFnZS5yYXRpbmcpICU+JQogIGFkZF9tYXJrZXJzKCkKYGBgCgoKCgpgYGB7ciBmaWcud2lkdGg9NX0KZGZfeWVhciA8LSBkZl95ZWFyICU+JSB1bmdyb3VwKCkgJT4lIG11dGF0ZShyZWxlYXNlX3llYXIgPSBhcy5udW1lcmljKHJlbGVhc2VfeWVhcikpICU+JSBmaWx0ZXIocmVsZWFzZV95ZWFyIDwgMjAxOSwgcmVsZWFzZV95ZWFyID49IDE5NjkpCmRmX3llYXIgPC0gZGZfeWVhciAlPiUgbXV0YXRlKGdlbnJlX2Vhcmx5X21haW4gPSBmY3RfcmVvcmRlcihnZW5yZV9lYXJseV9tYWluLCByZWxlYXNlX3llYXIpKQpkZl95ZWFyIDwtIGRmX3llYXIgJT4lIGZpbHRlcighaXMubmEoZ2VucmVfZWFybHlfbWFpbiksIG4+MCkKZ2dwbG90KGRmX3llYXIsIGFlcyh4PXJlbGVhc2VfeWVhciwgeT1wZXJjZW50LCBmaWxsPWdlbnJlX2Vhcmx5X21haW4pKSArIAogICAgZ2VvbV9hcmVhKHBvc2l0aW9uID0gJ3N0YWNrJykKYGBgCgpgYGB7cn0KZGZfeWVhcl9tb250aCA8LSBkZiAlPiUgbXV0YXRlKHJlbGVhc2VfeWVhciA9IHN0cl9zdWIoUmVsZWFzZS5kYXRlLDEsNCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZV95ZWFyX21vbnRoID0gc3RyX3N1YihSZWxlYXNlLmRhdGUsMSw3KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAlPiUgCiAgZ3JvdXBfYnkocmVsZWFzZV95ZWFyX21vbnRoKSAlPiUgCiAgY291bnQoZ2VucmVfZWFybHlfbWFpbikgJT4lIAogIG11dGF0ZShwZXJjZW50ID0gbi9zdW0obikpIyAlPiUgCiAgI3VuZ3JvdXAoKSAlPiUgCiAgI211dGF0ZShyZWxlYXNlX3llYXJfbW9udGggPSBsdWJyaWRhdGU6OmFzX2RhdGV0aW1lKHJlbGVhc2VfeWVhcl9tb250aCkpICU+JSAKICAjbXV0YXRlKGdlbnJlX2Vhcmx5X21haW4gPSBmY3RfcmVvcmRlcihnZW5yZV9lYXJseV9tYWluLCByZWxlYXNlX3llYXJfbW9udGgpKQoKCmRmX3llYXJfbW9udGggJT4lIAogIGdncGxvdChhZXMoeD1yZWxlYXNlX3llYXJfbW9udGgsIHk9cGVyY2VudCwgZmlsbD1nZW5yZV9lYXJseV9tYWluKSkgKyAKICBnZW9tX2FyZWEocG9zaXRpb249J3N0YWNrJykKCmRmX3llYXJfbW9udGgKYGBgCgo=